package com.warm.base.design.s_decorator;

/**
 * @Date: 2019/11/22 10:23
 * @Author: LChuang
 * @Description: 装饰者(结构型)
 *
 *      动态地给一个对象添加一些额外的职责。就增加功能来说，Decorator模式相比生成子类更加灵活。
 */
public class Client {

    /**
     * 扩展一个类的功能或者给一个类添加附加职责 : 继承的有力补充，比继承灵活，不改变原有对象的情况下给一个对象扩展功能
     * 给一个对象动态的添加功能，或动态撤销功能 : 通过使用不同装饰类以及这些类的排列组合
     * 符合开闭原则
     */
    /**
     * Component: 抽象构件角色：Component是一个抽象类或接口，是要包装的原始对象。
     * ConcreteComponent: 具体构件角色：是Component的实现类，最终要装饰的实际对象。
     * Decorator: 装饰角色：是一个抽象类，继承或实现了Component的接口，同时它持有一个对Component实例对象的引用，也可以有自己的方法。
     * ConcreteDecorator: 具体装饰角色：是Decorator的实现类，是具体的装饰者对象，负责给ConcreteComponent附加责任。
     */
    public static void main(String[] args) {
        //创建原始对象
        Component component = new ConcreteComponent();
        // 第一次装饰
        component = new ConcreteDecoratorA(component);
        // 第二次装饰
        component = new ConcreteDecoratorB(component);
        // 两次装饰后操作
        component.operate();
    }
}
